/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.servicio.implementaciones;

import desarrollosoft.ghce.dao.interfaces.IComponenteDAO;
import desarrollosoft.ghce.dao.interfaces.IPlantillaImagenesDAO;
import desarrollosoft.ghce.dao.interfaces.IPlantillaLaboratorioDAO;
import desarrollosoft.ghce.dao.interfaces.ISexoDAO;
import desarrollosoft.ghce.dao.interfaces.IUnidadMedidaDAO;
import desarrollosoft.ghce.dao.interfaces.IValorNormalDAO;
import desarrollosoft.ghce.entidades.Componente;
import desarrollosoft.ghce.entidades.PlantillaEstudioImagenes;
import desarrollosoft.ghce.entidades.PlantillaEstudioLaboratorio;
import desarrollosoft.ghce.entidades.Sexo;
import desarrollosoft.ghce.entidades.UnidadMedida;
import desarrollosoft.ghce.entidades.ValorNormal;
import desarrollosoft.ghce.servicio.interfaces.IServicioPlantillas;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author ariel
 */
@Service("servicioPlantillas")
public class ServicioPlantillas implements IServicioPlantillas {

    @Autowired
    @Qualifier("plantillaLaboratorioDAO")
    private IPlantillaLaboratorioDAO plantillaLaboratorioDAO;
    
    @Autowired
    @Qualifier("plantillaImagenesDAO")
    private IPlantillaImagenesDAO plantillaImagenesDAO;
    
    @Autowired
    @Qualifier("componenteDAO")
    private IComponenteDAO componenteDAO;
    
    @Autowired
    @Qualifier("valorNormalDAO")
    private IValorNormalDAO valorNormalDAO;
    
    @Autowired
    @Qualifier("sexoDAO")
    private ISexoDAO sexoDAO;
    
    @Autowired
    @Qualifier("unidadMedidaDAO")
    private IUnidadMedidaDAO unidadMedidaDAO;

    @Override
    @Transactional
    public void crearPlantillaLaboratorio(PlantillaEstudioLaboratorio plantillaEstudioLaboratorio) throws Exception {
        plantillaLaboratorioDAO.crearPlantilla(plantillaEstudioLaboratorio);
    }

    @Override
    @Transactional
    public void crearPlantillaImagenes(PlantillaEstudioImagenes plantillaEstudioImagenes) throws Exception {
        plantillaImagenesDAO.crearPlantilla(plantillaEstudioImagenes);
    }

    @Override
    @Transactional
    public void modificarPlantillaLaboratorio(PlantillaEstudioLaboratorio plantillaEstudioLaboratorio) throws Exception {
        plantillaLaboratorioDAO.modificarPlantilla(plantillaEstudioLaboratorio);
    }

    @Override
    @Transactional
    public void modificarPlantillaImaginologia(PlantillaEstudioImagenes plantillaEstudioImagenes) throws Exception {
        plantillaImagenesDAO.modificarPlantilla(plantillaEstudioImagenes);
    }

    @Override
    @Transactional
    public void eliminarPlantillaLaboratorio(PlantillaEstudioLaboratorio plantillaEstudioLaboratorio) throws Exception {
        List<Componente> listaComponentes = componenteDAO.obtenerComponentes(plantillaEstudioLaboratorio);
        for (Componente componente : listaComponentes) {
            valorNormalDAO.eliminarValoresNormales(componente);
        }
        componenteDAO.eliminarComponentes(listaComponentes);
        plantillaLaboratorioDAO.eliminar(plantillaEstudioLaboratorio);
    }

    @Override
    @Transactional
    public void eliminarPlantillaImaginologia(PlantillaEstudioImagenes plantillaEstudioImagenes) throws Exception {
        plantillaImagenesDAO.eliminarPlantillaImaginologia(plantillaEstudioImagenes);
    }

    @Override
    public List<Componente> obtenerTodosComponentes(PlantillaEstudioLaboratorio plantillaEstudioLaboratorio) {
        return componenteDAO.obtenerTodosComponentes(plantillaEstudioLaboratorio);
    }

    @Override
    public List<Sexo> obtenerSexos() {
        return sexoDAO.obtenerTodosSexo();
    }

    @Override
    public List<UnidadMedida> obtenerUnidadesMedida() {
        return unidadMedidaDAO.obtenerTodasUnidadMedida();
    }

    @Override
    public List<ValorNormal> obtenerValoresNormales(Componente componente) {
        return valorNormalDAO.obtenerTodosValoresNormales(componente);
    }

    @Override
    @Transactional
    public void crearComponente(Componente componente) throws Exception {
        componenteDAO.crearComponente(componente);
    }

    @Override
    @Transactional
    public void modificarComponente(Componente componente) throws Exception {
        componenteDAO.modificarComponente(componente);
    }

    @Override
    @Transactional
    public void crearValorNormal(ValorNormal valorNormalValidar) throws Exception {
        List<ValorNormal> listaValoresNormales =
                valorNormalDAO.traerTodosValoresNormales(valorNormalValidar.getComponente(), valorNormalValidar.getSexo());
        for (ValorNormal valorNormal : listaValoresNormales) {
            if (valorNormal.seSuperponenEdades(valorNormalValidar)) {
                throw new Exception("Ya hay un Valor Normal que abarca el Sexo y el rango de edades ingresados");
            }
        }
        valorNormalDAO.crearValorNormal(valorNormalValidar);
    }

    @Override
    @Transactional
    public void modificarValorNormal(ValorNormal valorNormalValidar) throws Exception {
        List<ValorNormal> listaValoresNormales =
                valorNormalDAO.traerTodosValoresNormales(valorNormalValidar.getComponente(), valorNormalValidar.getSexo());
        for (ValorNormal valorNormal : listaValoresNormales) {
            if (valorNormal.seSuperponenEdades(valorNormalValidar) && !valorNormal.equals(valorNormalValidar)) {
                throw new Exception("Ya hay un Valor Normal que abarca el Sexo y el rango de edades ingresados");
            }
        }
        valorNormalDAO.modificarValorNormal(valorNormalValidar);
    }

    @Override
    @Transactional
    public void eliminarComponente(Componente componente) throws Exception {
        valorNormalDAO.eliminarValoresNormales(componente); // borro los valores normales
        componenteDAO.eliminarComponente(componente); // borro el componente
    }

    @Override
    @Transactional
    public void eliminarValorNormal(ValorNormal valorNormal) throws Exception {
        valorNormalDAO.eliminarValorNormal(valorNormal);
    }
    
}
